package com.example.tools.Result;

import com.example.domain.vo.user.ListVo;
import com.example.tools.page.PageInfo;

/**
 * @Author: czx
 * @Date: 2022/1/28
 * @Title: ResultData
 * @Description: 相应结果数据模型
 * @params
 * @return 返回类型
 */
public class ResultData<T extends Data> implements Result<PageInfo<ListVo.Meta>> {
    /**
     * 结果码
     */
    private int status;

    /**
     * 错误消息
     */
    private String error;

    /**
     * 响应消息
     */
    private String message;
    /**
     * 响应数据
     */
    private T data;

    /**
     * 创建一个新的实例 ResultData.
     */
    private ResultData() {

    }

    /**
     * @param @return 参数
     * @return int    返回类型
     * @throws
     * @Title: getStatus
     * @Description: 获取状态码
     */
    public int getStatus() {
        return status;
    }

    /**
     * @param @return 参数
     * @return String    返回类型
     * @throws
     * @Title: getError
     * @Description: 获取错误消息
     */
    public String getError() {
        return error;
    }

    /**
     * @param @return 参数
     * @return String    返回类型
     * @throws
     * @Title: getMsg
     * @Description: 获取响应消息
     */
    public String getMessage() {
        return message;
    }

    /**
     * @param @return 参数
     * @return T    返回类型
     * @throws
     * @Title: getData
     * @Description: 获取数据
     */
    public T getData() {
        return data;
    }

    /**
     * @param @param  <T>
     * @param @param  resultStatus
     * @param @param  error
     * @param @return 参数
     * @return ResultData<T>    返回类型
     * @throws
     * @Title: makeError
     * @Description: 创建通用结果响应
     */
    public static <T extends Data> ResultData<T> makeError(ResultStatus resultStatus,
                                                           String error) {
        return makeResult(resultStatus, error, null, null);
    }

    /**
     * @param @param  <T>
     * @param @param  resultStatus
     * @param @param  message
     * @param @return 参数
     * @return ResultData<T>    返回类型
     * @throws
     * @Title: makeMessage
     * @Description: 创建通用结果响应
     */
    public static <T extends Data> ResultData<T> makeMessage(ResultStatus resultStatus,
                                                             String message) {
        return makeResult(resultStatus, null, message, null);
    }

    /**
     * @param @param  <T>
     * @param @param  resultStatus
     * @param @param  data
     * @param @return 参数
     * @return ResultData<T>    返回类型
     * @throws
     * @Title: makeData
     * @Description: 创建通用结果响应
     */
    public static <T extends Data> ResultData<T> makeData(ResultStatus resultStatus,
                                                          T data) {
        return makeResult(resultStatus, null, null, data);
    }

    /**
     * @param @param  <T>
     * @param @param  resultStatus
     * @param @param  error
     * @param @param  message
     * @param @param  data
     * @param @return 参数
     * @return ResultData<T>    返回类型
     * @throws
     * @Title: makeResult
     * @Description: 创建通用结果响应
     */
    public static <T extends Data> ResultData<T> makeResult(ResultStatus resultStatus,
                                                            String error,
                                                            String message,
                                                            T data) {
        ResultData<T> result = new ResultData<>();
        result.status = resultStatus.getStatus();
        result.error = error;
        result.message = message;
        result.data = data;
        return result;
    }
}
